package com.tedu.day02.oop;

/**
 *  抽象类特点<补充>
 *      类：成员变量/成员方法/构造方法
 *      抽象类：成员变量/成员方法/构造方法
 *      创建抽象类---普通类变成(实现)子类--继承抽象类
 *      成员变量：既可以变量，也可以常量
 *      构造方法：有，用于子类调用抽象【父】类的成员变量---赋值
 *      成员方法：既可以抽象，也可以非抽象
 *      抽象方法与非抽象方法出现在抽象类问题：
 *      A：抽象方法  【重写】强制要求子类完成父类抽象方法
 *      B：非抽象方法  【拓展】子类继承的事情，提高代码复用性
 */
abstract class  Foo{
    //成员变量
    public int i=10;
    public final int J=20;   //成员变量：常量
    //Java强类型语言：大小写分明
    // public  int j=30;
    //构造方法:无参
    public Foo()  {
        this (30);  //调用当前类对象的其他构造器
    }
    public Foo(int i) {
        this.i = i;
    }
    // 成员方法:抽象方法
    public abstract void show();
    //成员方法:非抽象方法
    public  void method (){
        System.out.println("Foo     method");
    }
}

//实现{子}类
class Goo extends Foo{
    public void show() {
        System.out.println("Goo  show");
    }
    public void method(){
        System.out.println("Goo  method");
    }
}
public class 抽象类补充知识点 {
    public  static void main(String[] args) {
         //抽象类----继承---多态性---向上造
         Foo f=new Goo();
          //①实例化---子类的构造器，默认存在无参构造器
        //再通过super()调用父类无参构造器
         //②执行抽象类无参构造器，发现有this(参数)调用本类其他有参构造器
        //③this调用的同时，完成对抽象类中i进行赋值   i=30
        System.out.println(f.i);       //④输出：i的值30
         //f.J=40;  不可修改
        System.out.println(f.J);

        //--------------------------
        f.show();  //输出：Goo  show   重写
        f.method();   //输出：Goo   method   拓展【子类方法重写】
    }
}
/*拓展：abstract关键字共存问题*/
abstract class Aoo{
      //private abstract void show1();  冲突    private是私有的   abstract是继承   私有的不能被继承
      //public final abstract void show2();  冲突   final是最终，不能再继承
      //public static abstract void show3(); //无意义：静态方法和抽象方法二选一，静态方法需要加语法块{}
}